package fr.esisar.cs420.traitement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;



/**
 * Classe      : Album
 * Explication : Classe permettant de gérer les albums
 * @author Hermitte : Dieng : Delay
 *
 */
public class Album {
	
	
	/**
	 * Liste permettant de lister les albums
	 */
	private final static List<InfoAlbum> list = new ArrayList<InfoAlbum>();
	
	
	/**
	 * Methode permettant de rajouter un album dans list
	 * @param album : album à stocker
	 */
	public static void addAlbum(InfoAlbum album) {
		list.add(album);
	}

	
	/**
	 * Methode permettant de supprimer tous les albums stockés dans list
	 */
	public static void removeAlbum() {
		list.removeAll(list);
	}

	/**
	 * Methode permettant d'obtenir un element present dans list
	 * @return l'element voulu
	 */
	public static List<InfoAlbum> getList() {
		return list;
	}
	
	/**
	 * Methode permettant d'obtenir l'identifiant de l'album demandé
	 * @param titre : titre de l'album
	 * @return l'identifiant de l'album
	 */
	public static int getElementId(String titre) {
				
		for(int i =0 ; i < list.size(); i++){
			
			if(list.get(i).getTitre().equals(titre))
			{
				return list.get(i).getIdAlbum();
			}
		}
		
		return (Integer) null ;
		
	}
	
	/**
	 * Methode permettant d'obtenir l'identifiant du livre demandé
	 * @param titre : titre de l'album
	 * @return l'identifiant de l'album
	 */
	public static int getElementIdLivre(String titre) {
				
		for(int i =0 ; i < list.size(); i++){
			
			if(list.get(i).getTitre().equals(titre))
			{
				return list.get(i).getIdLivre();
			}
		}
		
		return (Integer) null ;
		
	}
	
	/**
	 * Methode permettant de remplir la liste (list) avec les albums en fonction de leur visibilité
	 * Si : visible = 1 : remplit avec la liste des albums publics
	 *      visible = 0 : remplit avec la liste des albums privés du client connecté
	 * @param visible : visibilité demandé
	 */
	public static void getAlbums(int visible){
		
		String select ;
		
		/* Albums publics */
		if(visible == 1 ){
			 select = " SELECT a.idalbum , a.titre FROM Album a  where idLivre is null and visible = " + visible;
		}
		/* Albums privés du client */
		else{
			 select = " SELECT a.idalbum , a.titre FROM Album a , CLient c where a.idLivre is null and a.idClient = c.mail and c.mail like '" + Application.client.getMail() +"'" ;
		}

		try {
			
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			ResultSet res = stmt.executeQuery(select);	
			int ordre = 1 ;
			
			/* Pour les résultats */
			while (res.next())
			{
				/* on recupere les informations de l'album */
				InfoAlbum album = new InfoAlbum(ordre + " : " + res.getString(2),res.getInt(1));	
				/* on stocke dans la liste */
				Album.addAlbum(album);
				ordre ++ ;
				
			}
			
			/* on commit */
			stmt.executeUpdate("COMMIT");
			res.close();
			
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}
		
			
	}
	
	/**
	 * Methode permettant d'obtenir le chemin d'une image d'un album
	 * @param object : Identifiant d'un album
	 * @param ordre  : Ordre de l'image
	 * @return chemin de l'image
	 */
	public static String afficher(Object object, int ordre ){
		
		String select = " SELECT i.chemin FROM Album a , Image i  , AlbumContient c  where i.idimage = c.idimage and c.idAlbum = a.idAlbum and a.idAlbum = " + object + " and c.numOrdre = " + ordre;
		String chemin = null ;
		
		try {
			
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			ResultSet res = stmt.executeQuery(select);
			
			/* S'il y a un resultat */
			if (res.next() != false ){
							
			    chemin = res.getString(1);			
				stmt.executeUpdate("COMMIT");
				res.close();
			}
			
			
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}
		return chemin;
		
	}
	
	/**
	 * Methode permettant d'obtenir l'odre Max d'un Album
	 * @param idAlbum : Identifiant de l'album
	 * @return la valeur du MaxOrdre
	 */
	public static int getMaxOrdre(int idAlbum){
		
	    String select = " SELECT max(NumOrdre) from AlbumContient where idAlbum = " + idAlbum;

	    int ordre = 0 ;
	    	    
		try {

			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			ResultSet res = stmt.executeQuery(select);
			
			res.next();
				
			/* S'il y a un résultat */
			if(res.getString(1) != null)	
		    ordre = Integer.valueOf(res.getString(1)) ;			
			
			stmt.executeUpdate("COMMIT");
			res.close();
			
			
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}
		
		return ordre ;
	}
	
	/**
	 * Methode permettant d'ajouter une photo à un album
	 * L'image sera ajoute à la fin de l'album
	 * @param idAlbum : Identifiant d'un album
	 * @param chemin  : Chemin de l'image a ajouter
	 */
	public static void ajouterPhoto(int idAlbum,String chemin){
		
		
		int ordre = 0 ;		
		String idImage = null ;
		
		/* Recuperation de la connection a la base de donnee */
		Statement stmt = Application.getStmt();
			
		/* On recupere l'ordreMax de l'album */
		ordre = getMaxOrdre(idAlbum);	
		ordre = ordre + 1 ;
			
		/* Commande */
		String insertImage = "insert into Image values('','"+chemin+"', '' )" ;		
	    String	select = " SELECT i.idImage from Image i where i.chemin like '"+ chemin +"'";

			
		try {
			
			/* Execution des commandes */
			stmt = Application.getStmt();
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			
			/* Si l'image est déjà présente dans la base de donnée on ne l'ajoute pas */
			if(isAlreadyLoad(chemin) == false ){
				
				/* insertion de l'image dans la table Image */
				stmt.executeQuery(insertImage);	
			}
			
			ResultSet res = stmt.executeQuery(select);	
			res.next();
			
			/* on récupère l'identifiant de l'image ajoutée */
		    idImage =  res.getString(1);	
		    
			String insertContientAlbum = "insert into AlbumContient values('" + idAlbum + "','"+idImage+"','"+ordre+"','','' ) ";
		     
			res.close();
	
			stmt.executeUpdate("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");	
			/* Insertion dans la table AlbumContient */
			stmt.executeQuery(insertContientAlbum);
			
			/* on commit */
			stmt.executeUpdate("COMMIT");
		
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}	
		
	}
	
	/**
	 * Methode permettant de savoir si une image est déjà charger dans la base de donnée
	 * @param chemin : chemin de l'image
	 * @return : true  : l'image est présente dans la table Image
	 * 		   : false : l'image n'est pas présente dans la table Image
	 */
	public static boolean isAlreadyLoad(String chemin){
		
		String select = " SELECT i.chemin FROM Image i  " ;
			
		try {
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			ResultSet res = stmt.executeQuery(select);
					
			while(res.next()){
				
				/* Si l'image est déjà présente */
				if(res.getString(1).equals(chemin) ){
									
					return true;
				}
				
			}	
			
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}
		/* l'image n'est pas présente dans la table Image */
		return false;		
	}
	
	
	/**
	 * Methode permettant de savoir si une image est déjà associé à un Album
	 * @param chemin  : Chemin de l'image
	 * @param idAlbum : Identifiant de l'album	
	 * @param idImage : Identifiant de l'image
	 * @return : true  : l'image est déja associé à l'album
	 * 		   : false : l'image est déja associé à l'album
	 */
	public static boolean isAlreadyLoad(String chemin, int idAlbum, int idImage){
		
		String select = " SELECT i.chemin FROM Image i , AlbumContient a where i.idImage = a.idImage and a.idAlbum = "+ idAlbum + "and a.idImage = " + idImage ;
			
		try {
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			ResultSet res = stmt.executeQuery(select);
				
			/* Pas de résultat : l'image n'est pas associé */
			if(res.next() == false){
				
				return false ;
				
			}			
			
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}
		
		return true ;
		
	}
		
	/**
	 * Methode permettant de savoir si un Album est Public ou non
	 * @param idAlbum : Identifiant de l'album
	 * @return : true  : l'album est public
	 * 		   : false : l'album n'est pas public
	 */
	public static boolean isVisible(int idAlbum){
		
		String select = " SELECT a.visible FROM Album a where a.idAlbum =  "+ idAlbum;
				
		try {
			
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			ResultSet res = stmt.executeQuery(select);
					
			while(res.next()){

				/* Si égale à 1 : Public*/
				if(res.getInt(1) == 1 ){
									
					return true ;
				}
				
			}
					
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}
		return false;		
	}
	

	/**
	 * Methode permettant d'obtenir les informations d'un album
	 * @param idAlbum
	 * @return
	 */
	public static InfoAlbum GetInfoAlbum(int idAlbum)
	{
		
		String select = " SELECT titre , soustitre  FROM Album  where idAlbum =  " + idAlbum ;
		
		InfoAlbum album = null;
		
		try {
			
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			stmt.executeUpdate("SET TRANSACTION READ ONLY");
			ResultSet res = stmt.executeQuery(select);
			
			res.next();
			
			/* On récupère les informations */
			album = new InfoAlbum(res.getString(1),-1, res.getString(2));
			
			stmt.executeUpdate("COMMIT");
			res.close();
			
			
		} catch (SQLException e) {
			System.out.println("Erreur");
			e.printStackTrace();
		}
		
		return album;		
		
	}
	
	
	
		
	/**
	 * Methode permettant de créer un Album
	 * @param titre : titre de l'album
	 * @param visible : visibilité de l'album : 1 : Public : 0 : Privé
	 */
	public static void creationAlbum(String titre, int visible){
	
		String insertAlbum = "insert into Album values('','"+titre+"','',"+visible+",null, '"+Application.client.getMail()+ "' ) ";
		
		try {
			Statement stmt = Application.getStmt();
			int res = stmt.executeUpdate(insertAlbum);
			
			if (res == 0){
				System.out.println("Erreur UPDATE SQL"); 
			}
			stmt.executeUpdate("COMMIT");
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Methode permettant de créer un Album
	 * @param titre : titre de l'album
	 * @param visible : visibilité de l'album : 1 : Public : 0 : Privé
	 */
	public static void creationAlbumLivre(String titre, int visible,String idLivre){
	
		String insertAlbum = "insert into Album values('','"+titre+"','',"+visible+","+idLivre+", '"+Application.client.getMail()+ "' ) ";
		
		try {
			Statement stmt = Application.getStmt();
			int res = stmt.executeUpdate(insertAlbum);
			
			if (res == 0){
				System.out.println("Erreur UPDATE SQL"); 
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	
	/**
	 * Methode permettant de supprimer un Album
	 * @param idAlbum : Identifiant des Albums
	 */
	public static void deleteAlbum(int idAlbum){
	
		String deleteAlbum = " delete from Album where idAlbum = " + idAlbum;
		String selectImage = " select idImage from AlbumContient where idAlbum = " + idAlbum;
		
		/* Liste des images de l'album */
	    List<String> listImage = new ArrayList<String>();
					
		try {
			
			Statement stmt = Application.getStmt();
			ResultSet res = stmt.executeQuery(selectImage);

			/* Chargement des images de l'albums */
			while(res.next()){
				
				listImage.add(res.getString(1));	
				
			}
			
			/* Suppression des images de l'albums */
			for(int i = 0 ; i < listImage.size(); i++){
				
				deleteImage(listImage.get(i),idAlbum);
			}
					
			/*On supprime l'album */
		    stmt.executeUpdate(deleteAlbum);
		    /* On commit */
			stmt.executeUpdate("COMMIT");
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
/**
 * Methode permettant de supprimer une photo liée à un album
 * @param idImage : Identifiant d'image
 * @param idAlbum : Identifiant de l'album
 */
	public static void deleteImage(String idImage, int idAlbum){
			
        String select = "select chemin, count(chemin) from image , AlbumContient a where a.idImage = " + idImage+ " group by chemin";
        String deleteImageContient = "delete from AlbumContient where idImage = "+ idImage+ " and idAlbum = "+ idAlbum;
        String deleteImage = "delete from Image where idImage = " + idImage;
             
		try {
			
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			ResultSet res = stmt.executeQuery(select);

			res.next();
					
			/* Si l'image est présente que dans l'album à supprimer
			 * On supprime le lien entre l'album et l'image dans AlbumContient
			 * On supprime l'image dans la table Image
			 */
			if(res.getInt(2)==1){
				stmt.executeUpdate(deleteImageContient);
				stmt.executeUpdate(deleteImage);
			}
			/* Si l'image est présente dans d'autre l'album 
			 * On supprime seulement le lien entre l'album à supprimer et l'image dans AlbumContient
			 * On garde l'image dans la table Image
			 */
			else{
				stmt.executeUpdate(deleteImageContient);
				
			}
		    		
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
	}
		
	/**
	 * Methode permettant de gérer les informations d'un album
	 * @param idAlbum    : Identifiant de l'album
	 * @param titre      : titre de l'album
	 * @param sousTitre  : Soustitre de l'album
	 * @param visible    : visibilité de l'album
	 */
	public static void gererInfoAlbum(int idAlbum , String titre , String sousTitre , int visible ){

		String update = "UPDATE Album SET titre = '"+titre+"', soustitre = '"+sousTitre+"' , visible = "+ visible+ " WHERE idAlbum = "+idAlbum;
		
		try {
			/* Recuperation de la connection a la base de donnee */
			Statement stmt = Application.getStmt();
			/* Execution de la commande */
			int res = stmt.executeUpdate(update);
			
			if (res == 0){
				System.out.println("Erreur UPDATE SQL"); 
			}
			
			stmt.executeUpdate("COMMIT");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	
	
	
	
	
}
